#include <Arduino.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <RTClib.h>
#include <ESP8266WiFi.h>
#include "ai_water_analyzer.h"
#include "sensor_manager.h"
#include "data_logger.h"

// 定义引脚
#define SD_CS_PIN 4
#define RTC_INTERRUPT_PIN 2
#define WIFI_RESET_PIN 3

// 初始化RTC
RTC_DS3231 rtc;

// 初始化传感器管理器
SensorManager sensorManager;

// 初始化数据记录器
DataLogger dataLogger(SD_CS_PIN);

// 初始化AI水质分析器
AIWaterAnalyzer aiAnalyzer;

// WiFi配置
const char* ssid = "YourWiFiSSID";
const char* password = "YourWiFiPassword";

void setup() {
  // 初始化串口通信
  Serial.begin(9600);
  
  // 初始化I2C通信
  Wire.begin();
  
  // 初始化RTC
  if (!rtc.begin()) {
    Serial.println("无法初始化RTC模块！");
  }
  
  // 初始化传感器管理器
  sensorManager.init();
  
  // 初始化数据记录器
  if (!dataLogger.init()) {
    Serial.println("无法初始化SD卡！");
  }
  
  // 初始化AI水质分析器
  aiAnalyzer.init();
  
  // 初始化WiFi
  initWiFi();
  
  // 记录系统启动信息
  String logMessage = "系统启动时间: " + getCurrentTimeString();
  dataLogger.logEvent(logMessage);
  Serial.println(logMessage);
}

void loop() {
  // 读取所有传感器数据
  WaterQualityData data = sensorManager.readAllSensors();
  
  // 添加时间戳
  DateTime now = rtc.now();
  data.timestamp = now.unixtime();
  
  // 使用AI分析器检测水质异常
  int anomalyStatus = aiAnalyzer.detectAnomaly(data);
  
  // 如果检测到异常，触发告警
  if (anomalyStatus > 0) {
    triggerAlarm(anomalyStatus);
  }
  
  // 记录数据到SD卡
  dataLogger.logData(data);
  
  // 显示数据
  displayData(data, anomalyStatus);
  
  // 发送数据到服务器
  if (WiFi.status() == WL_CONNECTED) {
    sendDataToServer(data);
  }
  
  // 每10秒采集一次数据
  delay(10000);
}

void initWiFi() {
  WiFi.begin(ssid, password);
  Serial.print("连接WiFi...");
  
  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 30) {
    delay(500);
    Serial.print(".");
    attempts++;
  }
  
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println("已连接！");
    Serial.print("IP地址: ");
    Serial.println(WiFi.localIP());
  } else {
    Serial.println("连接失败！");
  }
}

String getCurrentTimeString() {
  DateTime now = rtc.now();
  char timeString[20];
  sprintf(timeString, "%04d-%02d-%02d %02d:%02d:%02d",
          now.year(), now.month(), now.day(),
          now.hour(), now.minute(), now.second());
  return String(timeString);
}

void triggerAlarm(int anomalyStatus) {
  // 触发本地告警（LED闪烁、蜂鸣器等）
  // 发送告警消息到服务器
  
  String alarmMessage = "检测到水质异常: " + String(anomalyStatus) + " - " + getCurrentTimeString();
  dataLogger.logEvent(alarmMessage);
  Serial.println(alarmMessage);
}

void displayData(WaterQualityData data, int anomalyStatus) {
  // 在LCD上显示数据
  // 此处简化，实际应根据LCD型号实现
  
  // 同时在串口打印数据
  Serial.println("--- 水质数据 ---");
  Serial.print("时间: ");
  Serial.println(getCurrentTimeString());
  Serial.print("pH值: ");
  Serial.println(data.phValue, 2);
  Serial.print("溶解氧: ");
  Serial.println(data.doValue, 2);
  Serial.print("电导率: ");
  Serial.println(data.ecValue, 2);
  Serial.print("温度: ");
  Serial.println(data.temperature, 1);
  Serial.print("浊度: ");
  Serial.println(data.turbidity, 2);
  
  if (anomalyStatus > 0) {
    Serial.print("异常状态: ");
    Serial.println(anomalyStatus);
  }
  
  Serial.println("----------------");
}

void sendDataToServer(WaterQualityData data) {
  // 通过HTTP或MQTT发送数据到服务器
  // 实际实现应根据服务器接口而定
  WiFiClient client;
  if (client.connect("your-server.com", 80)) {
    String postData = "time=" + getCurrentTimeString() +
                      "&ph=" + String(data.phValue, 2) +
                      "&do=" + String(data.doValue, 2) +
                      "&ec=" + String(data.ecValue, 2) +
                      "&temp=" + String(data.temperature, 1) +
                      "&turbidity=" + String(data.turbidity, 2);
                      
    client.println("POST /api/water-quality HTTP/1.1");
    client.println("Host: your-server.com");
    client.println("Content-Type: application/x-www-form-urlencoded");
    client.print("Content-Length: ");
    client.println(postData.length());
    client.println();
    client.println(postData);
    client.stop();
  }
}